package br.edu.oxente.buzz.entity;

import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Nigini A. Oliveira - ensino@nigini.com.br
 */
public class Buzz {

	private User owner;
	private List<User> followers, followeds;
	private List<Post> posts;

	public Buzz(User owner) {
		this.owner = owner;
		this.posts = new LinkedList<Post>();
		this.followeds = new LinkedList<User>();
		this.followers = new LinkedList<User>();
	}

	/**
	 * Retorna o usuário dono desta conta Buzz.
	 * @return o usuário dono desta conta Buzz.
	 */
	public User getOwner() {
		return owner;
	}

	/**
	 * Retorna os últimos posts inseridos.
	 * @return uma lista contendo um numero "max" de post, todos os posts
	 * caso "max" maior que o total de posts, e <code>NULL</code> caso
	 * o "max" seja menor que zero.
	 */
	public List<Post> getPosts(int max) {
		if (max >= 0) {
			int total = max;
			if (max > posts.size()) {
				total = posts.size();
			}
			return posts.subList(0, total);
		}
		return null;
	}

	/**
	 * Adiciona um post no inicio da lista. Caso o mesmo já exista, precisa
	 * ser removido antes.
	 * @param newPost post a ser (re)inserido.
	 */
	public void insertPost(Post newPost) {
		this.posts.remove(newPost);
		this.posts.add(0, newPost);
	}

	/**
	 * Realiza a checagem se o post já existe na lista de postagem, se caso sim, o post
	 * é reposicionado para o começo da lista, dado que foi repostado.
	 * @param existingPost post a ser repostado.
	 * @return <code>TRUE</code> caso o post exista e tenha sido repostado, e <code>FALSE</code>
	 * caso o mesmo ainda não exista nas postagens.
	 */
	public boolean reShare(Post existingPost) {
		if (this.posts.remove(existingPost)) {
			this.posts.add(0, existingPost);
			return true;
		}
		return false;
	}

	/**
	 * Adiciona um novo seguido.
	 * @param userToFollow Usuario a ser seguido. 
	 * @return <code>TRUE</code> caso o usuario esteja sendo seguido agora, e <code>FALSE</code>
	 * caso o userToFollow já esteja sendo seguido.
	 */
	public boolean follow(User userToFollow) {
		if (this.followeds.contains(userToFollow)) {
			return false;
		} else {
			this.followeds.add(userToFollow);
			return true;
		}
	}

	/**
	 * Adiciona um novo seguidor.
	 * @param follower Usuario seguidor.
	 * @return <code>TRUE</code> caso o usuario seja inserido como seguidor, e <code>FALSE</code>
	 * caso o follower já presente na lista.
	 */
	public boolean insertFollower(User follower) {
		if (this.followers.contains(follower)) {
			return false;
		} else {
			this.followers.add(follower);
			return true;
		}
	}

	/**
	 * Retorna a lista de seguidores desta conta Buzz.
	 * @return a lista de seguidores desta conta Buzz.
	 */
	public List<User> getFollowers() {
		return this.followers;
	}

	/**
	 * Retorna a lista de usuarios seguidos por esta conta Buzz.
	 * @return a lista de usuarios seguidos por esta conta Buzz.
	 */
	public List<User> getFollowed() {
		return this.followeds;
	}

	/**
	 * Insere um comentário no Post definido. 
	 * @param post post a ser encontrado e comentado.
	 * @param comment comentário a ser inserido.
	 * @return <code>TRUE</code> caso o post seja encontrado e <code>FALSE</code>
	 * caso contrário.
	 */
	public boolean insertComment(Post post, Comment comment) {
		if (post == null || comment == null) {
			return false;
		}
		int index = this.posts.indexOf(post);
		if (index < 0) {
			return false;
		} else {
			this.posts.get(index).insertComment(comment);
			return true;
		}
	}

	/**
	 * Promove o post, subindo sua prioridade no Buzz.
	 * @param post post a ser procurado e atualizado.
	 */
	public void promovePost(Post post) {
		if (this.posts.contains(post)) {
			this.insertPost(post);
		}
	}
}
